package array;

import java.util.Arrays;

/**
 * @author justnow
 * Created on 2020-10-07
 * Description
 */
public class Leetcode88 {
    public static void main(String[] args) {
        int[] nums1 = {0};
        int[] nums2 = {1};
        int m = 0, n = 1;
        merge(nums1, m, nums2, n);
    }

    /**
     * 方法一，个人想到的方法，但是要注意不能修改nums1的引用地址
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        if (m == 0) {
            System.arraycopy(nums2, 0, nums1, 0, n);
        }
        int[] res = new int[m + n];
        int indexA = 0, indexB = 0, indexC = 0;
        while (indexA < m && indexB < n) {
            if (nums1[indexA] < nums2[indexB]) {
                res[indexC] = nums1[indexA];
                indexA++;
            } else {
                res[indexC] = nums2[indexB];
                indexB++;
            }
            indexC++;
        }
        if (indexA < m) {
            //表示将nums1从下标indexA位置开始，拷贝到res中的下标为indexC的位置，且copy的长度为m-indexA
            System.arraycopy(nums1, indexA, res, indexC, m - indexA);
        }
        if (indexB < n) {

            System.arraycopy(nums2, indexB, res, indexC, n - indexB);
        }
        nums1 = res;
    }

    /**
     * 方法二，合并后排序
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
    public static void merge2(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2, 0, nums1, m, n);
        Arrays.sort(nums1);
    }

    /**
     * 方法三，先确定后面的，再确定前面的内容
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
    public static void merge3(int[] nums1, int m, int[] nums2, int n) {
        int len1 = m - 1;
        int len2 = n - 1;
        int len = m + n - 1;
        while (len1 >= 0 && len2 >= 0) {
            nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
        }
        if (len2 >= 0) {
            System.arraycopy(nums2, 0, nums1, 0, len2 + 1);
        }
    }
}
